﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.EnlaceDatos.SqlServer;
using System.Net;
using System.Net.Mail;

namespace vudu.Logica.Clases
{
    public class Escuela
    {
        #region Atributos

        private int _idEscuela;
        private string _nombreEscuela;
        private List<Profesor> _listaProfesor;
        private List<Pensum> _listaPensum;
        private List<Materia> _listaMateria;
        private string _descripcionEscuela;
        private string _telefonoEscuela;
        private string _directorEscuela;
        private string _direccionEscuela;
        private int _estadoEscuela;
        private SqlServerEscuela sqlServerDatosEscuela = new SqlServerEscuela();

        #endregion

        #region Constructor

        public Escuela(string nombreEscuela, string descripcionEscuela, string telefonoEscuela, string directorEscuela, string direccionEscuela, int estadoEscuela)
        {
            _nombreEscuela = nombreEscuela;
            _descripcionEscuela = descripcionEscuela;
            _telefonoEscuela = telefonoEscuela;
            _directorEscuela = directorEscuela;
            _direccionEscuela = direccionEscuela;
            _estadoEscuela = estadoEscuela;

        }


        public Escuela ()
        {
        }



        #endregion

        #region Gets y Sets

        
        public int IdEscuela
        {
            get { return _idEscuela; }
            set { _idEscuela = value; }
        }

        public string NombreEscuela
        {
            get { return _nombreEscuela; }
            set { _nombreEscuela = value; }
        }

        public string DescripcionEscuela
        {
            get { return _descripcionEscuela; }
            set { _descripcionEscuela = value; }
        }


        private List<Profesor> ListaProfesor
        {
            get { return _listaProfesor; }
            set { _listaProfesor = value; }
        }

        public List<Pensum> ListaPensum
        {
            get { return _listaPensum; }
            set { _listaPensum = value; }
        }


        public string TelefonoEscuela
        {
            get { return _telefonoEscuela; }
            set { _telefonoEscuela = value; }
        }

        public string DirectorEscuela
        {
            get { return _directorEscuela; }
            set { _directorEscuela = value; }
        }

        public string DireccionEscuela
        {
            get { return _direccionEscuela; }
            set { _direccionEscuela = value; }
        }

        public int EstadoEscuela
        {
            get { return _estadoEscuela; }
            set { _estadoEscuela = value; }
        }

        //private List<Profesor> ListaProfesor
        //{
        //    get { return _listaProfesor; }
        //    set { _listaProfesor = value; }
        //}

        private List<Materia> ListaMateria
        {
            get { return _listaMateria; }
            set { _listaMateria = value; }
        }

        #endregion

        #region Metodos de Manejo


        public int AgregarEscuela(Escuela escuela, string universidad)
        {
            return sqlServerDatosEscuela.InsertarEscuela(escuela,universidad);
        }

        public List<Escuela> ConsultarListaEscuela(string nombre)
        {
            try
            {
                return sqlServerDatosEscuela.SeleccionListaEscuela(nombre);
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        public Escuela ConsultarEscuelaPorId(int idEscuela)
        {
            return sqlServerDatosEscuela.ConsultarEscuela(idEscuela);
        }

        public bool ModificandoEscuela(Escuela escuela)
        {
            return sqlServerDatosEscuela.ModificarEscuela(escuela);
        }

        public bool EliminarEscuela(Escuela escuela)
        {
            return sqlServerDatosEscuela.EliminarEscuela(escuela);
        }

        public bool AgregarProfesor()
        {
            return true;
        }

        public bool ModificarProfesor()
        {
            return true;
        }
        public bool EliminarProfesor()
        {
            return true;
        }

      //  public List<Profesor> ConsultarProfesor()
      //  {

      //  }

        public void ConfirmarCambioPensum()
        {

        }

        public void PensumActual()
        {

        }

        public void PensumNuevo()
        {

        }

        public override bool Equals(object comparar)
        {
            if ((comparar == null) || (comparar.GetType()==typeof(Escuela))) return false;

            if (ReferenceEquals(this, comparar)) return true;

            return (
                IdEscuela == (comparar as Escuela).IdEscuela &&
                NombreEscuela == (comparar as Escuela).NombreEscuela &&
                DescripcionEscuela == (comparar as Escuela).DescripcionEscuela &&
                DirectorEscuela == (comparar as Escuela).DirectorEscuela &&
                DireccionEscuela == (comparar as Escuela).DireccionEscuela &&
                TelefonoEscuela == (comparar as Escuela).TelefonoEscuela &&
                EstadoEscuela == (comparar as Escuela).EstadoEscuela
                );
        }

        #region GRUPO 2 - Metodos para Gestion de Horarios PreMatricula

        public List<Estudiante> EstudiantesHorario()
        {
            
            /** 
             * Esta funcion me retorna toda la lista de estudiantes pertenecientes a esta escuela junto con su lista
             * de horarios
             **/
            
            try
            {
                List<Estudiante> retorno = new List<Estudiante>();
                SqlServerHorarioPreMatricula sql = new SqlServerHorarioPreMatricula();

                retorno = sql.CargarHorariosEstudiantes(this._idEscuela);

                return retorno;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public List<Estudiante> EstudiantesHorariosPendientes()
        {
            
            /**
             * Esta funcion hace uso del procedimiento "EstudiantesHorario" y se encarga de filtrar a una lista solo
             * los estudiantes que posean horarios de prematricula con el estatus de "Pendientes" para ser utilizado
             * por la escuela para aprobar los horarios de los estudiantes
             **/
            
            try
            {
                List<Estudiante> estudiantes = new List<Estudiante>();
                List<Estudiante> retorno = new List<Estudiante>();

                estudiantes = this.EstudiantesHorario();

                foreach (Estudiante estudiante in estudiantes)
                {
                
                    bool bandera = false;
                
                    foreach ( HorarioPreMatricula horario in estudiante.ListaHorarioPreMatricula )
                    {
                        if (horario.Estatus == "Pendiente") //si tiene algun horario tipo Pendiente levanto la bandera
                            bandera = true;
                    }
                
                    if (bandera) // Si la bandera es true, el estudiante tiene horario tipo Pendinte, agrego a la lista de retorno
                    {
                        retorno.Add(estudiante);
                    }
  
                }

                return retorno;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public void ActualizarEstatus(int idHorario)
        {
            
            /*
             * Esta funcion se encarga de ahcer una llamada a la clase de SqlServerHorarioPreMatricula para modificar
             * el estatus del horario, identificado por el idHorario pasado por parametro, de Aprobado a Historial.
             */

            try
            {
                SqlServerHorarioPreMatricula sql = new SqlServerHorarioPreMatricula();
                bool verificacion = new bool();
                verificacion = sql.CambioEstatusHorario(idHorario);
            }
            catch (Exception)
            {}
        }

        public bool SimularFinPeriodoAcademico()
        {
            
            /*
             * Esta funcion se encarga de pasar los horarios que posean estatus de Activo a Historial y hace la llamada
             * a la clase de SqlServerHorarioPreMatricula para hacer las actualizaciones correspondientes en base de datos
             */
            
            try
            {
                bool retorno = true;
                List<Estudiante> estudiantes = new List<Estudiante>();
                SqlServerHorarioPreMatricula sql = new SqlServerHorarioPreMatricula();

                estudiantes = sql.CargarHorariosEstudiantes(this._idEscuela);

                foreach (Estudiante miEstudiante in estudiantes)
                {

                    foreach (HorarioPreMatricula miHorario in miEstudiante.ListaHorarioPreMatricula)
                    {

                        if (miHorario.Estatus.CompareTo("Activo") == 0)
                        {
                            miHorario.Estatus = "Historial";

                            SqlServerHorarioPreMatricula sql1 = new SqlServerHorarioPreMatricula();
                            if (!sql1.CambioEstatusHorario(miHorario.Codigo))
                                retorno = false;
                        }

                    }

                }

                return retorno;
            }
            catch (Exception)
            {
                return false;
            }

        }

        public bool EnviarCorreo(int idEstudiante, HorarioPreMatricula horario)
        {

            /*
             * Este procedimiento se encarga de mandarle un correo al estudiante indicandole el nombre del horario que
             * se le aprobo
             */

            SqlServerHorarioPreMatricula sql = new SqlServerHorarioPreMatricula();
            Estudiante estudiante = new Estudiante();
            estudiante = sql.BuscarEstudiante(idEstudiante);

            MailMessage correo = new MailMessage();

            correo.To.Add(new MailAddress(estudiante.Correo));
            correo.From = new MailAddress("vudu.mail.service@gmail.com");
            correo.Subject = "Horario Aprobado";
            correo.Body = "Hemos aprobado el horario identificado con el nombre: " + horario.Nombre;

            SmtpClient client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("vudu.mail.service@gmail.com", "vudu12345universidad"),
                EnableSsl = true
            };

            try
            {

                client.Send(correo);
                return true;
            }

            catch (Exception)
            {
                return false;
            }
        }

        public bool AprobarHorario(int idEstudiante, int idHorario)
        {

            try
            {
                bool retorno = false;

                SqlServerHorarioPreMatricula sql = new SqlServerHorarioPreMatricula();
                Estudiante estudiante = new Estudiante();
                estudiante.ListaHorarioPreMatricula = sql.CargarMisHorarios(idEstudiante);


                foreach (HorarioPreMatricula miHorario in estudiante.ListaHorarioPreMatricula)
                {
                    if (miHorario.Codigo == idHorario)
                    {
                        miHorario.Estatus = "Activo";
                        this.EnviarCorreo(idEstudiante, miHorario);
                        retorno = sql.AprobarHorario(idHorario);
                    }
                    else
                    {
                        if (miHorario.Estatus == "Pendiente")
                        {
                            sql.EliminarPreMatricula(miHorario.Codigo);
                        }
                    }
                }

                estudiante.ListaHorarioPreMatricula.RemoveAll(
                    delegate(HorarioPreMatricula horario1)
                    { return horario1.Estatus.Equals("Pendiente"); });


                return retorno;
            }
            catch (Exception)
            {
                return false;
            }
        
        }

        #endregion

        #region GRUPO 6 - gestion de pensum

        public int ConsultarPensumActivoEscuela(Escuela pensumEscuela)
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.ConsultarPensumActivo(pensumEscuela.IdEscuela);
        }

        public List<Pensum> ConsultarPensums(Escuela pensumEscuela)
        {
            SqlServerPensum sqlServerPensum = new SqlServerPensum();
            return sqlServerPensum.ConsultarPensumInactivos(pensumEscuela);
        }
        #endregion

        #endregion
    }
}